package org.test.jmx.standard;

import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

import com.sun.jdmk.comm.HtmlAdaptorServer;

/**
 * 使用j2ee自带的MBServer，注册一个MBean，然后调用MBean的方法
 * 
 * @author lenovo
 * 
 */
public class Agent {
	private static ObjectName objectName;
	private static MBeanServer mBeanServer;

	public static void main(String[] args) throws Exception {
		new Agent().init();
	}

	/**
	 * 初始化
	 * 
	 * @throws Exception
	 */
	private void init() throws Exception {
		ServerImpl serverImpl = new ServerImpl();
		ServerMonitor serverMonitor = new ServerMonitor(serverImpl);
		
		// JMX 的核心是 MBServer。Java SE 已经提供了一个默认实现，可以通过
		// MBServerFactory.createMBeanServer()获得。
		mBeanServer = MBeanServerFactory.createMBeanServer();
		// 每个资源监控者（MBean）一般都会有名称（ObjectName）， 登记在 MBServer 内部的一个 Repository 中。
		// 注意，这个 ObjectName 对于每一个 MBServer 必须是唯一的，只能对应于一个 MBean。
		objectName = new ObjectName("SimpleAgent:name=ServerMonitor1");
		mBeanServer.registerMBean(serverMonitor, objectName);
		 
		// 初始化一个Adaptor，可以通过html访问(为了远程访问)
		HtmlAdaptorServer adapter = new HtmlAdaptorServer();
		ObjectName adapterName = new ObjectName(
				"SimpleAgent:name=htmladapter,port=9092");
		adapter.setPort(9092);
		
		//远程rmi
//		JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");
//        JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mBeanServer);

		// 完成向 MBeanServer 注册工作的
		mBeanServer.registerMBean(adapter, adapterName);
		adapter.start();
	}

	private static void manage() throws Exception {
		//server可以通过本地直接访问的方式
		Long upTime = (Long) mBeanServer.getAttribute(objectName, "UpTime");
		System.out.println(upTime);
	}
}
